package com.lp.business.wxpay.utils.weixin;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.jdom.Element;

import com.lp.business.wxpay.utils.weixin.config.WxPayConfig;

public class PayUtil {
	 /**  
     * 签名字符串  
     * @param text需要签名的字符串  
     * @param input_charset编码格式  
     * @return 签名结果  
     */   
    public static String sign(String text,String input_charset) {   
        return DigestUtils.md5Hex(getContentBytes(text, input_charset)).toUpperCase();   
    }   
    /**  
     * 签名字符串  
     *  @param text需要签名的字符串  
     * @param sign 签名结果  
     * @param key密钥  
     * @param input_charset 编码格式  
     * @return 签名结果  
     */   
    public static boolean verify(String text, String sign, String key, String input_charset) {   
        String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset)).toUpperCase();   
        if (mysign.equals(sign)) {   
            return true;   
        } else {   
            return false;   
        }   
    }   
    /**  
     * @param content  
     * @param charset  
     * @return  
     * @throws SignatureException  
     * @throws UnsupportedEncodingException  
     */   
    public static byte[] getContentBytes(String content, String charset) {   
        if (charset == null || "".equals(charset)) {   
            return content.getBytes();   
        }   
        try {   
            return content.getBytes(charset);   
        } catch (UnsupportedEncodingException e) {   
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);   
        }   
    }   
    
    /**  
     * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串  
     * @param params 需要排序并参与字符拼接的参数组  
     * @return 拼接后字符串  
     */   
    public static String createLinkStringWithKey(Map<String, String> params) {   
    	String prestr= createLinkString(params);
        prestr += ("&key=" + WxPayConfig.key);//加盐
        return prestr;
    }
    
    /**  
     * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串  
     * @param params 需要排序并参与字符拼接的参数组  
     * @return 拼接后字符串  
     */   
    public static String createLinkString(Map<String, String> params) {   
    	List<String> keys = new ArrayList<String>(params.keySet());   
    	Collections.sort(keys);   
    	String prestr = "";   
    	for (int i = 0; i < keys.size(); i++) {   
    		String key = keys.get(i);   
    		String value = params.get(key);   
    		if (i == keys.size() - 1) {// 拼接时，不包括最后一个&字符   
    			prestr = prestr + key + "=" + value;   
    		} else {   
    			prestr = prestr + key + "=" + value + "&";   
    		}   
    	}
    	return prestr; 
    }   
    /**  
     *  
     * @param requestUrl请求地址  
     * @param requestMethod请求方法  
     * @param outputStr参数  
     */   
    public static String httpRequest(String requestUrl,String requestMethod,String outputStr){   
        // 创建SSLContext   
        StringBuffer buffer = null;   
        try{   
	        URL url = new URL(requestUrl);   
	        HttpURLConnection conn = (HttpURLConnection) url.openConnection();   
	        conn.setRequestMethod(requestMethod);   
	        conn.setDoOutput(true);   
	        conn.setDoInput(true);   
	        conn.connect();   
	        //往服务器端写内容   
	        if(null !=outputStr){   
	            OutputStream os=conn.getOutputStream();   
	            os.write(outputStr.getBytes("utf-8"));   
	            os.close();   
	        }   
	        // 读取服务器端返回的内容   
	        InputStream is = conn.getInputStream();   
	        InputStreamReader isr = new InputStreamReader(is, "utf-8");   
	        BufferedReader br = new BufferedReader(isr);   
	        buffer = new StringBuffer();   
	        String line = null;   
	        while ((line = br.readLine()) != null) {   
	        	buffer.append(line);   
	        }   
	        br.close();
        }catch(Exception e){   
            e.printStackTrace();   
        }
        return buffer.toString();
    }
    
	public static String map2XmlString(Map<String, String> map) {
        String xmlResult = "";

        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        for (String key : map.keySet()) {
            System.out.println(key + "========" + map.get(key));

            String value = "<![CDATA[" + map.get(key) + "]]>";
            sb.append("<" + key + ">" + value + "</" + key + ">");
            System.out.println();
        }
        sb.append("</xml>");
        xmlResult = sb.toString();

        return xmlResult;
    }

    /**
     * @description 将xml字符串转换成map
     * @param xml
     * @return Map
     */
    public static Map<String, String> xmlString2Map(String xmlStr) {
        Map<String, String> map = new HashMap<String, String>();
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xmlStr); // 将字符串转为XML
            org.dom4j.Element rootElt = doc.getRootElement(); // 获取根节点
            @SuppressWarnings("unchecked")
            List<Element> list = rootElt.elements();// 获取根节点下所有节点
            for (Element element : list) { // 遍历节点
                map.put(element.getName(), element.getText()); // 节点的name为map的key，text为map的value
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
   
//    /**
//	 * 解析xml,返回第一级元素键值对。如果第一级元素有子节点，则此节点的值是子节点的xml数据。
//	 * @param strxml
//	 * @return
//	 * @throws JDOMException
//	 * @throws IOException
//	 */
//	@SuppressWarnings({ "rawtypes", "unchecked" })
//	public static Map doXMLParse(String strxml) throws Exception {
//		if(null == strxml || "".equals(strxml)) {
//			return null;
//		}
//		Map m = new HashMap();
//		InputStream in = String2Inputstream(strxml);
//		SAXBuilder builder = new SAXBuilder();
//		org.jdom.Document doc = builder.build(in);
//		Element root = doc.getRootElement();
//		List list = root.getChildren();
//		Iterator it = list.iterator();
//		while(it.hasNext()) {
//			Element e = (Element) it.next();
//			String k = e.getName();
//			String v = "";
//			List children = e.getChildren();
//			if(children.isEmpty()) {
//				v = e.getTextNormalize();
//			} else {
//				v = getChildrenText(children);
//			}
//			
//			m.put(k, v);
//		}
//		//关闭流
//		in.close();
//		
//		return m;
//	}
//	/**
//	 * 获取子结点的xml
//	 * @param children
//	 * @return String
//	 */
//	@SuppressWarnings("rawtypes")
//	public static String getChildrenText(List children) {
//		StringBuffer sb = new StringBuffer();
//		if(!children.isEmpty()) {
//			Iterator it = children.iterator();
//			while(it.hasNext()) {
//				Element e = (Element) it.next();
//				String name = e.getName();
//				String value = e.getTextNormalize();
//				List list = e.getChildren();
//				sb.append("<" + name + ">");
//				if(!list.isEmpty()) {
//					sb.append(getChildrenText(list));
//				}
//				sb.append(value);
//				sb.append("</" + name + ">");
//			}
//		}
//		
//		return sb.toString();
//	}
//	
//	public static InputStream String2Inputstream(String str) {
//		return new ByteArrayInputStream(str.getBytes());
//	}
	
	/*暂未使用*/
//	/**  
//     * 生成6位或10位随机数 param codeLength(多少位)  
//     * @return  
//     */   
//    public static String createCode(int codeLength) {   
//        String code = "";   
//        for (int i = 0; i < codeLength; i++) {   
//            code += (int) (Math.random() * 9);   
//        }   
//        return code;   
//    }  
//    
//    public static boolean isValidChar(char ch) {   
//        if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))   
//            return true;   
//        if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))   
//            return true;// 简体中文汉字编码   
//        return false;   
//    } 
}
